home *** CD-ROM | disk | FTP | other *** search
- /*
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
- ┃Q&A(FMTOWNS版) ///// Tab Size : 4 ///// ┃
- ┃ ///// Margin : 120 ///// ┃
- ┃ QA.c v1.0 L18 ┃
- ┃ ┃
- ┃ (C)K.Konishi 16-Aug-93 ┃
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
- */
-
- #define MAIN
-
- #include "Platform.h"
-
- #include "cd.h"
- #include <EGB.h>
- #include <MOS.h>
- #include <CDRFRB.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <conio.h>
- #include <FMCFRB.h>
- #include <msdos.cf>
- #include "aoi_lib2.h"
-
- AOIbuttonData AbD[BUTTON];
-
- #define KeyESC 0x1b
- #define Key1 0x31
- #define Key9 0x39
- #define KeyA 0x41
- #define KeyZ 0x5A
- #define Keya 0x61
- #define Keyz 0x7A
- #define FontSX 12
- #define FontSY 12
- #define FontAX 6
- #define FontAY 12
- #define INIT_X 120
- #define INIT_Y 120
- #define BUTTON_X 16
- #define BUTTON_Y 16
- #define BUTTON_FX BUTTON_X + 1
- #define BUTTON_FY BUTTON_Y + 1
- #define WIN_FRAME 5
- #define WIN_FRAMEx2 (WIN_FRAME << 1)
- #define FS_NORMAL 0
- #define FS_FUTOJI 1
- #define FS_SHATAI 2
- #define FS_KAGEJI 4
- #define FS_FUCHI 8
- #define FS_UNDERL 16
- #define FS_OVERL 32
- #define FS_KESHIL 64
- #define FS_12FONT 99
- #define MAX_WIDE 70
- #define ARGV_MAX 30
- #define ARGV_MAX_JI 256
- #define MAX_ARGV_LONG_12 95
- #define MAX_ARGV_LONG_16 50
-
- enum {MENU, CONSOLE, TOWNS, CDPLAYER, HIGH, LOW, CDPLAY};
-
- void AKANEmessage(void)
- {
- puts("Q&A V1.0 (c)1993 KUNIZO KONISHI\n");
- puts("run386 QA -[オプション] [質問] [選択肢1]・・・・・・\n");
- puts(" -m : TownsMENU上で選択する");
- puts(" -c : コンソール上で選択する");
- // puts("\nrun386 QA -[オプション] -nD(画面非表示)\n");
- // puts(" -towns : FMTOWNSの機種を判別する");
- puts(" -high : 高速モードを設定する");
- puts(" -low : 互換モードを設定する");
- // puts(" -cdplay : CDPLAYER");
- }
-
- void AKANEbaseDraw(short sx, short sy, short lx, short ly, short bx, short by)
- {
- AOIwinBase(sx, sy, lx + 1, ly, 1);
-
- AOIbuttonBase(sx + 5, sy + 5, bx, by);
- AOIbuttonBase(sx + 22, sy + 5, lx - 27, by);
-
- AOIsetButton(&AbD[1], WIN_FRAME, WIN_FRAME, BUTTON_X, BUTTON_Y); // 終了
- AOIsetButton(&AbD[2], WIN_FRAME + BUTTON_X, WIN_FRAME, lx - WIN_FRAMEx2 - BUTTON_X , BUTTON_Y); // 移動
- }
-
- void AKANEbuttonSet(short sx, short sy, short lx, short fs, char argv[][ARGV_MAX_JI], short argvLen[], int a)
- {
- short i;
- AOIstringData asD; // AOIstrData型の変数宣言
-
- asD.sx = FontSX; // 16ドットフォントの設定
- asD.sy = FontSY;
- asD.ax = FontAX;
- asD.ay = FontAY;
- asD.sc = BLACK;
- asD.ss = fs;
-
- if (fs != FS_12FONT) {
- AOIstring(sx + WIN_FRAME + (lx >> 1) - argvLen[2] * (FontAX >> 1), sy + 2 + BUTTON_FY, &asD, argv[2]);
- } else {
- AOIsystem12Font(sx + WIN_FRAME + (lx >> 1) - argvLen[2] * (FontAX >> 1), sy + 3 + (BUTTON_FY >> 2),
- BLACK, argv[2]);
- }
- if (a != 0) {
- for (i = 3; i < a + 3; i++) {
- AOIbuttonBase(sx + WIN_FRAME, sy + WIN_FRAME + (i - 2) * BUTTON_FY, lx - WIN_FRAMEx2, BUTTON_Y - 1);
- AOIsetButton(&AbD[i], WIN_FRAME, WIN_FRAME + (i - 2) * BUTTON_FY, lx - WIN_FRAMEx2, BUTTON_Y - 1);
- if (fs != FS_12FONT) {
- AOIstring(sx + WIN_FRAME + (lx >> 1) - argvLen[i] * (FontAX >> 1), sy + 2 + (i - 1) * BUTTON_FY,
- &asD, argv[i]);
- } else {
- AOIsystem12Font(sx + WIN_FRAME + (lx >> 1) - argvLen[i] * (FontAX >> 1),
- sy + 3 + (i - 2) * BUTTON_FY + (BUTTON_FY >> 2), BLACK, argv[i]);
- }
- }
- }
- }
-
- void AKANEgraphInit(void)
- {
- int page, dpage, pri;
-
- EGB_resolution(work, 0, 0x43); // グラフィック仮想画面の設定
- EGB_resolution(work, 1, 0x43); // グラフィック仮想画面の設定
- page = EGB_getWritePage(0, 0); // 書き込みページの読み取り
- EGB_writePage(work, page | 0x40); // グラフィック書き込みページ
- EGB_getDisplayPage(&dpage, &pri); // 表示ページの読み取り
- EGB_displayPage(work, dpage, pri); // グラフィック表示ページの指定
- }
-
- void AKANEwideScreen(void)
- {
- int i;
- int para[10][2] = {
- {0, 110}, {1, 802}, {4, 909}, {29, 0}, {18, 130}, {22, 130},
- {9, 138}, {11, 138}, {10, 898}, {12, 898},
- };
-
- for(i = 0; i < 10; i++) {
- _outw(0x440, para[i][0]);
- _outw(0x442, para[i][1]);
- }
- }
-
- void AKANEmouseInit(void)
- {
- MOS_start(mwork, MosWorkSize);
- MOS_typeRom(80 + 1, 0, 0, pat_work);
- MOS_disp(1);
- }
-
- short AKANEohtoFile(char NewArgv[][ARGV_MAX_JI], int *argc, char *argv[])
- {
- FILE *fp;
- char line[ARGV_MAX_JI];
- char fileName[ARGV_MAX_JI];
- short i, j;
- // short k;
-
- i = 0;
- while ((fileName[i] = argv[2][i + 1]) != '\0') i++;
-
- if ((fp = fopen(fileName, "r")) == NULL) {
- perror("cannot open ohto file");
- return FALSE;
- }
-
- i = 2;
- while (fgets(line, ARGV_MAX_JI, fp)) {
- strcpy(NewArgv[i], line);
- // printf("%s\n", NewArgv[i]);
- j = -1;
- do {
- j++;
- } while (NewArgv[i][j] != '\n');
- NewArgv[i][j] = '\0';
- // printf("%s\n", NewArgv[i]);
- // for (k = 0; k != j + 3; k++) {
- // if (NewArgv[i][k] == '\0') printf("NULL");
- // else if (NewArgv[i][k] == '\n') printf("改行");
- // else printf("%c", NewArgv[i][k]);
- // }
- // printf("\n");
-
- i++;
- }
- *argc = i;
- fclose(fp);
-
- return TRUE;
- }
-
- short AKANEmouseWork(short *retNum, int argc, char *argv[]) // TownsMENU上での操作
- {
- short j, dmyLen = 0;
- short lx, ly;
- short fs = FS_NORMAL;
- short argvLen[ARGV_MAX];
- int ch, mx, my;
- int button = 0;
- char endmark = 0;
- char buttonLamp = OFF;
- short sx = INIT_X, sy = INIT_Y;
- short bx = BUTTON_X, by = BUTTON_Y;
- unsigned moji, encode;
- char dispTmp[(640 / 8) * 480]; // ドットデータの読み書き作業領域
- char dmmyArgv[MAX_ARGV_LONG_12];
-
- char Font12argv[ARGV_MAX][ARGV_MAX_JI]; // 12ドットフォント対策 全角変換後の argv
- char NewArgv[ARGV_MAX][ARGV_MAX_JI]; // 応答ファイル対策 応答ファイル読み取り後の argv
-
- if (argc < 3) { // パラメータの数をチェック
- AKANEmessage();
- *retNum = FALSE;
- return FALSE;
- }
-
- // fs (フォントスタイル)を決める
- if (!_strcmpi(argv[1], "-m0") || !_strcmpi(argv[1], "-m")) fs = FS_NORMAL;
- if (!_strcmpi(argv[1], "-m1")) fs = FS_FUTOJI;
- if (!_strcmpi(argv[1], "-m2")) fs = FS_SHATAI;
- if (!_strcmpi(argv[1], "-m3")) fs = FS_KAGEJI;
- if (!_strcmpi(argv[1], "-m4")) fs = FS_FUCHI;
- if (!_strcmpi(argv[1], "-m5")) fs = FS_UNDERL;
- if (!_strcmpi(argv[1], "-m6")) fs = FS_OVERL;
- if (!_strcmpi(argv[1], "-m7")) fs = FS_KESHIL;
- if (!_strcmpi(argv[1], "-m8")) fs = FS_12FONT;
-
- if (!strncmp(argv[2], "@", 1)) { // 応答ファイル処理 (応答ファイルの内容を NewArgv に格納)
- if(AKANEohtoFile(NewArgv, &argc, argv) == FALSE) { // 応答ファイルオープンチェック
- *retNum = FALSE;
- return FALSE;
- }
- } else {
- for (j = 2; j < argc; j++) {
- strcpy(NewArgv[j], argv[j]); // 何もせずに NewArgv に格納
- }
- }
-
- for (j = 2; j < argc; j++) {
- if (fs == FS_12FONT) {
- ank2sjis(Font12argv[j], NewArgv[j]); // 全角に変換後に Font12argv に格納
- strncpy(dmmyArgv, Font12argv[j], MAX_ARGV_LONG_12); // MAX_ARGV_LONG_12 文字以上は排除
- strcpy(Font12argv[j], dmmyArgv);
- } else {
- strcpy(Font12argv[j], NewArgv[j]); // 何もせずに Font12argv に格納
- strncpy(dmmyArgv, Font12argv[j], MAX_ARGV_LONG_16); // MAX_ARGV_LONG_16 文字以上は排除
- strcpy(Font12argv[j], dmmyArgv);
- }
- if (dmyLen < (argvLen[j] = strlen(Font12argv[j]))) dmyLen = argvLen[j]; // 身長測定
- }
- lx = WIN_FRAMEx2 + dmyLen * FontAX + 60; // lx, ly を決める
- ly = WIN_FRAMEx2 + (argc - 2) * BUTTON_FY - 1;
-
- AKANEgraphInit(); // グラッフィクスの初期化
- if ((dmyLen > MAX_WIDE) && (fs == FS_12FONT)) AKANEwideScreen(); // 一定文字数を越えた場合はワイド画面表示
- AOIgetGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
- AKANEbaseDraw(sx, sy, lx, ly, bx, by); // ウインドゥ描画
- AKANEbuttonSet(sx, sy, lx, fs, Font12argv, argvLen, argc - 3);
- AKANEmouseInit(); // マウスの初期化
- do {
- MOS_rdpos(&ch, &mx, &my);
- button = 0;
- if (ch == 1) button = AOIbutton(sx, sy, mx, my, AbD); // マウスの入力
- moji = KYB_read(1, &encode); // キーボートの入力
- switch (moji) {
- case KeyESC : // ESC
- button = 1;
- break;
- case Key1..Key9 : // 1~9
- button = moji - 46;
- if (argc - 3 < button - 2) button = 0;
- break;
- case KeyA..KeyZ : // A~Z
- button = moji - 55;
- if (argc - 3 < button - 2) button = 0;
- break;
- case Keya..Keyz : // a~z
- button = moji - 87;
- if (argc - 3 < button - 2) button = 0;
- break;
- }
- KYB_clrbuf();
- if (button > 0) { // ボタン反転
- if (button != 18 && button != 19 && button != 20) {
- AOIbuttonLamp(sx, sy, &AbD[button]);
- buttonLamp = ON;
- MOS_typeRom(115 + 1, 0, 0, pat_work); // マウスも変更
- if (button == 1) {
- MOS_typeRom(124 + 1, 0, 0, pat_work);
- }
- }
- }
- switch (button) {
- case 1 :
- endmark = 1; // 終了条件設定
- *retNum = FALSE;
- break;
- case 2 : // 移動
- AOIwindowMove(dispTmp, &sx, &sy, lx, ly);
- break;
- case 3..(ARGV_MAX + 2) :
- endmark = 1; // 値を返す
- *retNum = button - 2;
- break;
- }
- if (buttonLamp == ON) { // ボタンの反転
- if (button > 0) {
- AOIbuttonLamp(sx, sy, &AbD[button]);
- buttonLamp = OFF;
- MOS_typeRom(80 + 1, 0, 0, pat_work); // マウスも元通り
- }
- }
- } while (endmark != 1);
- MOS_end();
- AOIputGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
- }
-
- short AKANEconsoleWork(short *retNum, int argc, char *argv[]) // コンソール上での選択
- {
- unsigned moji, encode;
- int button = 0;
- char endmark = 0;
- short item = 0;
-
- if (argc < 3) { // パラメータの数をチェック
- AKANEmessage();
- *retNum = FALSE;
- return FALSE;
- }
- printf("%s\n\n", argv[2]); // 質問の表示
- for (item = 3; item < argc; item++) printf(" %d. %s\n", item - 2, argv[item]); // 選択肢の表示
- if (item == 4) printf("\n何かキーを押してください\n");
- else printf("\n1 ~ %d の中から選んでください", item - 3);
- do {
- button = 0;
- moji = KYB_read(1, &encode);
- switch (moji) {
- case KeyESC : // ESC
- button = 1;
- break;
- case Key1..Key9 : // 1~9
- button = moji - 46;
- if (item - 3 < button - 2) button = 0;
- break;
- case KeyA..KeyZ : // A~Z
- button = moji - 55;
- if (item - 3 < button - 2) button = 0;
- break;
- case Keya..Keyz : // a~z
- button = moji - 87;
- if (item - 3 < button - 2) button = 0;
- break;
- }
- KYB_clrbuf();
- switch (button) {
- case 1 :
- endmark = 1; // 終了条件設定
- *retNum = FALSE;
- break;
- case 3..20 :
- endmark = 1; // 値を返す
- *retNum = button - 2;
- break;
- default :
- printf("\r1 ~ %d の中から選んでください", item - 3);
- }
- } while (endmark != 1);
- printf("\n");
- }
-
- void AKANEtownsWork(short *retNum, char *argv[]) // TOWNS機種判別
- {
- char *machine[] = {"", "初代", "2代目", "3代目", "IIUX", "IICX"};
- short m;
-
- m = AOItownsName();
- if (_strcmpi(argv[2], "-nD")) {
- if (m == 0) printf("I don't know.\n");
- else printf("This TOWNS is %s.\n", machine[m]);
- }
- *retNum = m;
- return;
- }
-
- void AKANEmodeWork(short *retNum, char *argv[], BYTE mode) // TOWNS II のモード設定
- {
- short m;
-
- m = AOItownsName();
- if (_strcmpi(argv[2], "-nD")) {
- if (1 <= m && m <= 4) {
- printf("このTOWNSは%sモードを設定できません\n", (mode == HIGH) ? "高速" : "互換");
- } else {
- printf("%sモードに設定しました\n", (mode == HIGH) ? "高速" : "互換");
- }
- }
- outp(0x05ec, (mode == HIGH) ? 1 : 0);
- *retNum = TRUE;
- return;
- }
-
- void PanicMessage(void)
- {
- puts("Q&A V1.0 (c)1993 KUNIZO KONISHI\n");
- puts("QA.expは、TMENU上以外からは、起動させないで下さい。\n");
- puts("もし、画面が乱れている場合は");
- puts("[ESC]キーを押した後");
- puts("TMENUに戻ってください。\n");
- puts("コンソールによっては、画面が固定している場合もあります。\n");
- }
-
- short StartingFunction(int argc, char *argv[])
- {
- BYTE inputer;
- short retNum;
-
- if (argc < 2) {
- AKANEmessage();
- return FALSE;
- }
- if (!strnicmp(argv[1], "-m", 2)) { // -m -m1 -m2・・・ の場合
- inputer = MENU;
- PanicMessage();
- } else if (!_strcmpi(argv[1], "-c")) {
- inputer = CONSOLE;
- } else if (!_strcmpi(argv[1], "-towns")) {
- inputer = TOWNS;
- } else if (!_strcmpi(argv[1], "-high")) {
- inputer = HIGH;
- } else if (!_strcmpi(argv[1], "-low")) {
- inputer = LOW;
- } else if (!_strcmpi(argv[1], "-cdplay")) {
- inputer = CDPLAY;
- PanicMessage();
- } else {
- AKANEmessage();
- return FALSE;
- }
-
- if (inputer == MENU) { // TMENU(-m?)のときの処理
- AKANEmouseWork(&retNum, argc, argv);
- }
- if (inputer == CONSOLE) { // コンソール(-c)のときの処理
- AKANEconsoleWork(&retNum, argc, argv);
- }
- if (inputer == TOWNS) { // TOWNS機種判別(-towns)のときの処理
- AKANEtownsWork(&retNum, argv);
- }
- if (inputer == HIGH) { // TOWNS II の高速モード設定(-high)のときの処理
- AKANEmodeWork(&retNum, argv, HIGH);
- }
- if (inputer == LOW) { // TOWNS II の互換モード設定(-low)のときの処理
- AKANEmodeWork(&retNum, argv, LOW);
- }
- if (inputer == CDPLAY) { // CDPLAYER(-cdplay)のときの処理
- extern AKANEcdplayWork(void);
- retNum = AKANEcdplayWork();
- }
- return retNum;
- }
-
- short main(int argc, char *argv[])
- {
- return StartingFunction(argc, argv);
- }